package com.example.movie.mate.web;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import java.io.Serializable;

/**
 * 用于表示API请求结果的类，可以泛型化以支持各种返回数据类型
 * 实现了Serializable接口，以便结果可以被序列化和反序列化
 *
 * @param <T> 泛型参数，表示返回数据的类型
 */
@Data
public class JsonResult<T> implements Serializable {

    /**
     * 响应状态码
     */
    @Schema(description = "响应状态码")
    private int state;
    /**
     * 响应消息，通常是错误信息
     */
    @Schema(description = "响应消息")
    private String message;
    /**
     * 响应数据
     */
    @Schema(description = "响应数据")
    private T data;

    // 私有无参构造方法，用于内部创建对象，不允许外部直接创建当前类型的对象
    private JsonResult() {
    }

    /**
     * 创建一个表示成功结果的JsonResult实例，不包含数据
     *
     * @return 表示成功结果的JsonResult实例
     */
    public static JsonResult ok() {
        return ok(null);
    }

    /**
     * 创建一个表示成功结果的JsonResult实例，包含指定数据
     *
     * @param data 成功时返回的数据，可以为null
     * @param <T>  泛型参数，与类的泛型参数一致
     * @return 包含指定数据的成功结果实例
     */
    public static <T> JsonResult ok(T data) {
        JsonResult<T> result = new JsonResult<>();
        result.state = StateCode.OK.getCode();
        result.data = data;
        return result;
    }

    /**
     * 创建一个表示失败结果的JsonResult实例
     *
     * @param stateCode 失败时的状态码
     * @param message   失败的描述信息
     * @return 包含指定状态码和描述信息的失败结果实例
     */
    public static JsonResult<Void> fail(StateCode stateCode, String message) {
        JsonResult<Void> result = new JsonResult<>();
        result.state = stateCode.getCode();
        result.message = message;
        return result;
    }

}
